#include <iostream>
#include <thread>

void threadFunction() {
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    // 创建并启动线程 t1
    std::thread t1(threadFunction);
    std::cout << "Thread t1 started." << std::endl;

    // 通过使用移动构造函数，线程的所有权从 t1 转移到 t2。此后 t1 变为 "空" 状态，不再拥有任何线程，因此不可 joinable。
    std::thread t2 = std::move(t1);
    std::cout << "Ownership of thread moved from t1 to t2." << std::endl;

    // 检查 t1 的状态以确认其不再拥有线程，这表明所有权转移成功。
    if (!t1.joinable()) {
        std::cout << "t1 is no longer joinable after move operation." << std::endl;
    }

    // 使用移动赋值操作符将 t2 的所有权移动到 t3。同样，这会使 t2 变为空状态，不再拥有任何线程。
    std::thread t3;
    t3 = std::move(t2);
    std::cout << "Ownership of thread moved from t2 to t3." << std::endl;

    // 检查 t2 的状态以确认其不再拥有线程
    if (!t2.joinable()) {
        std::cout << "t2 is no longer joinable after move assignment." << std::endl;
    }

    // 因为所有权现在在 t3，我们在程序结束前需要等待 t3 的线程完成以确保正确清理资源。
    t3.join();
    std::cout << "Thread t3 has completed and joined." << std::endl;

    return 0;
} 